home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / ARGCV.I < prev    next >
Encoding:
Modula Implementation  |  1990-11-10  |  2.9 KB  |  111 lines

  1. IMPLEMENTATION MODULE ArgCV;
  2.  
  3. (*$Y+,R-,C-*)
  4.  
  5. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, WORD, BYTE, TSIZE;
  6.  
  7. FROM PrgCtrl IMPORT ActiveProcess;
  8.  
  9.  
  10. PROCEDURE InitArgCV ( VAR ArgC : CARDINAL; VAR ArgV : ARRAY OF PtrArgStr );
  11.  
  12.   VAR comlin : Address;
  13.       i, quote : Cardinal;
  14.       append, inword : Boolean;
  15.       p: Address;
  16.  
  17.   PROCEDURE Peek (p:Address) : CHAR;
  18.     (*$L-*)
  19.     BEGIN
  20.       ASSEMBLER
  21.         MOVE.L  -(A3),A0
  22.         MOVE.B  (A0),(A3)+
  23.         ADDQ.L  #1,A3
  24.       END
  25.     END Peek;
  26.     (*$L=*)
  27.   
  28.   PROCEDURE Poke (p:Address;v:Byte);
  29.     (*$L-*)
  30.     BEGIN
  31.       ASSEMBLER
  32.         SUBQ.L  #1,A3
  33.         MOVE.B  -(A3),D0
  34.         MOVE.L  -(A3),A0
  35.         MOVE.B  D0,(A0)
  36.       END
  37.     END Poke;
  38.     (*$L=*)
  39.   
  40.   PROCEDURE isspace (c:Char):Boolean;
  41.     BEGIN
  42.       RETURN (c=' ') OR (c=11c) OR (c=15c) OR (c=12c)
  43.     END isspace;
  44.   
  45.   PROCEDURE newWd;
  46.     BEGIN
  47.       IF argc <= HIGH (argv) THEN
  48.         ArgV[argc] := PtrArgStr(p);
  49.       END;
  50.       Inc (argc);
  51.     END newWd;
  52.   
  53.   PROCEDURE tstQuote (n:CARDINAL);
  54.     BEGIN
  55.       IF quote = n THEN
  56.         Poke (p,0C);
  57.         quote := 0
  58.       ELSIF ~inword & (quote=0) THEN
  59.         Poke (p,0C);
  60.         quote := n;
  61.         INC (p);
  62.         newWd;
  63.         DEC (p)
  64.       END
  65.     END tstQuote;
  66.   
  67.   BEGIN
  68.     inword := False;
  69.     quote := 0;
  70.     argc := 1;    (* always have at least program name *)
  71.     
  72.     comlin:= ActiveProcess();
  73.     Inc (comlin, 128);
  74.     p := comlin+1L;
  75.     
  76.     FOR i:= 1 TO ORD (Peek(comlin)) DO
  77.         IF isspace(Peek(p)) THEN
  78.             IF quote=0 THEN
  79.                 inword := False;
  80.                 Poke (p,0C)
  81.             ELSE
  82.                 Poke (p,' ')
  83.             END;
  84.         ELSIF Peek(p) = '"' THEN
  85.             tstQuote (1);
  86.         ELSIF Peek(p) = "'" THEN
  87.             tstQuote (2);
  88.         ELSE
  89.             IF ~inword & (quote=0) THEN
  90.                 inword := True;
  91.                 newWd
  92.             END
  93.         END;
  94.         Inc (p);
  95.     END;
  96.     Poke (p,0C);  (* make sure last string is null terminated *)
  97.     
  98.     i:=argc;
  99.     WHILE i<=HIGH(argv) DO
  100.       ArgV[i] := PtrArgStr(p);
  101.       Inc (i)
  102.     END;
  103.     
  104.     argv[0] := p;          (* no program name *)
  105.     
  106.   END InitArgCV;
  107.  
  108. END ArgCV.
  109. ə
  110. (* $FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$0000008F$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1$FFF96AE1Ç$000003E1T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFEDDBC1$0000008F$0000006E$0000004F$FFEDB15C$000001C1$000003E1$000003FE$000003E5$000003F3$FFEDB15C$FFEDB15C$00000026$000005A4$000005BA$000005A4œÇÇ*)
  111.